import { toStringTypeCheck, ValueLimitTypeCheck } from './toStringTypeCheck';

/**
 * 代理 对象 使其 可枚举
 * -
 * 如果 反转对象不可以 枚举 返回 undefined
 * @param {Object} obj 枚举 对象 可以 反转对象查询
 * @returns {proxy}
 */
function enumObj(obj) {
  let reverseObj = reverseEnumObj(obj);
  if (!reverseObj) {
    console.log('sorry we reverse your obj default');
    return undefined;
  }
  let handler = {
    set: () => {},
    get(target, key) {
      if (Object.hasOwnProperty.call(target, key)) return target[key];
      if (Object.hasOwnProperty.call(reverseObj, key)) return reverseObj[key];
    },
  };

  return new Proxy(obj, handler);
}

/**
 * 反转 可枚举的 对象
 * @param {object} obj 枚举对象
 * @returns {{}|false}
 */
function reverseEnumObj(obj) {
  let returninfo = {};
  let limitArr = ['string', 'number'];
  for (const key in obj) {
    if (Object.hasOwnProperty.call(obj, key)) {
      const value = obj[key];
      if (!ValueLimitTypeCheck(value, limitArr)) {
        console.log(
          `sorry enum Default cause ${key} vaule type is ${toStringTypeCheck(
            value
          )} not [number | string]`
        );
        return false;
      }
      returninfo[value] = key;
    }
  }
  return returninfo;
}

export { enumObj };
